home *** CD-ROM | disk | FTP | other *** search
/ Magnum One / Magnum One (Mid-American Digital) (Disc Manufacturing).iso / d12 / tde11.arc / TDECOLOR.C < prev    next >
C/C++ Source or Header  |  1991-09-06  |  19KB  |  661 lines

  1. /*
  2.  * I have had several requests to implement a method for changing the colors
  3.  * used in tde.  I thought about using a configuration file, but I really
  4.  * didn't like that route.  Changing the executable file seemed the best way
  5.  * to go.  That way, you only need one file to run tde - the executable.
  6.  * Also, I didn't have to add a bunch of code to tde to parse a configuration
  7.  * file.  It doesn't take a lot of time to figure out the offsets of the those
  8.  * variables to initialize in tde.exe, so it's fairly easy to do.
  9.  *
  10.  * Program name:  tdecolor
  11.  * Author:        Frank Davis
  12.  * Date:          July 21, 1991
  13.  * Compiler:      MSC 6.0a and QuickC 2.5
  14.  *                cl /AS /Gs tdecolor.c
  15.  *                exehdr /max:1000 tdecolor
  16.  *
  17.  * This program is released into the public domain.  You may distribute
  18.  * it freely, Frank Davis
  19.  */
  20.  
  21.  
  22. /********    EXTREMELY IMPORTANT   ************/
  23. /*
  24.  * If you modify tde, it is your responsibility to find the offset of
  25.  * "static int colors" in function "hw_initialize" in file "main.c" in your
  26.  * new executable, tde.exe.
  27.  *
  28.  * If you don't change the default colors, search for the following string (a
  29.  * hexadecimal integer array) in your new executable file:
  30.  *
  31.  *  7000 0700 7000 7000 0f00 0700 7000 4b00 0700 1700 7f00 0f00 1a00 1a00
  32.  *
  33.  * Then, replace COLOR_OFFSET with your new one and recompile tdecolor.exe
  34.  * with the new offset.
  35.  */
  36.  
  37. #define  COLOR_OFFSET   56329l
  38.  
  39. /*******     EXTREMELY IMPORTANT   ************/
  40.  
  41.  
  42. #include <bios.h>
  43. #include <dos.h>
  44. #include <stdlib.h>
  45. #include <stdio.h>
  46. #include <string.h>
  47.  
  48. #include "tdecolor.h"
  49.  
  50. /**********************  prototypes  ********************************/
  51. void xygoto( int, int );
  52. void initialize( void );
  53. void video_config( void );
  54. void show_init_sample( void );
  55. void color_number( char *, int );
  56. void current_color_number( char *, int );
  57. int  getkey( void );
  58. void s_output( char far *, int, int, int );
  59. void cls( void );
  60. void hlight_line( int, int, int, int );
  61. void show_help_color( );
  62. void show_fileheader_color( );
  63. void show_text_color( );
  64. void show_block_color( );
  65. void show_warning_color( );
  66. void show_mode_color( );
  67. void show_wrapped_color( );
  68. void change_colors( void );
  69. /********************************************************************/
  70.  
  71.  
  72. char *greatest_composer_ever = "W. A. Mozart, 1756-1791";
  73.  
  74.  
  75. /*
  76.  * Default color settings.  Incidentally, I'm color blind (mild red-green) and
  77.  * the default colors look fine to me. ;*)
  78.  */
  79. static int colors[2][7] = {
  80.    { HERC_REVERSE, HERC_NORMAL, HERC_REVERSE, HERC_REVERSE, HERC_HIGH,
  81.      HERC_NORMAL, HERC_REVERSE },
  82.    { COLOR_HEAD, COLOR_TEXT, COLOR_MODE, COLOR_BLOCK, COLOR_MESSAGE,
  83.      COLOR_HELP, COLOR_WRAP }
  84. };
  85.  
  86. static int temp_colors[2][7];   /* play around with colors in this array */
  87. struct vcfg cfg;                /* video stuff */
  88. static int index;               /* 0 = Monochrome colors, 1 = color colors */
  89.  
  90. FILE *tde_exe;                  /* FILE pointer to tde.exe */
  91.  
  92.  
  93. /*
  94.  * Name:    main
  95.  * Date:    July 21, 1991
  96.  * Notes:   Strategy is fairly straight forward -  1) initialize all the
  97.  *          variables  2) show the user a color sample  3) make the changes
  98.  *          permanent if desired.
  99.  */
  100. main(  )
  101. {
  102.    initialize( );
  103.    cls( );
  104.    show_init_sample( );
  105.    change_colors( );
  106. }
  107.  
  108.  
  109. /*
  110.  * Name:    xygoto
  111.  * Date:    July 21, 1991
  112.  * Notes:   Use the video interrupt to set the cursor.
  113.  */
  114. void xygoto( int x, int y )
  115. {
  116. union REGS inregs, outregs;
  117.  
  118.    inregs.h.ah = 2;
  119.    inregs.h.bh = 0;
  120.    inregs.h.dh = y;
  121.    inregs.h.dl = x;
  122.    int86( VIDEO_INT, &inregs, &outregs );
  123. }
  124.  
  125.  
  126. /*
  127.  * Name:    initialize
  128.  * Date:    July 21, 1991
  129.  * Notes:   Open tde.exe if we can find it.  Set up all of the global variables.
  130.  */
  131. void initialize( )
  132. {
  133. int i, j;
  134.  
  135.    video_config( );
  136.  
  137.    if ((tde_exe = fopen( "tde.exe", "r+b" )) == NULL ) {
  138.       cls( );
  139.       s_output( "Cannot find tde.exe", 0, 0, 7 );
  140.       xygoto( 0, 1 );
  141.       exit( 1 );
  142.    }
  143.    fseek( tde_exe, COLOR_OFFSET, SEEK_SET );
  144.    fread( (void *)temp_colors, sizeof( temp_colors ), 1, tde_exe );
  145.  
  146.    if (cfg.color == FALSE)
  147.       index = 0;
  148.    else
  149.       index = 1;
  150.  
  151.    fields[0].color = temp_colors[index][HELP];
  152.    fields[1].color = temp_colors[index][HEAD];
  153.    fields[2].color = temp_colors[index][TEXT];
  154.    fields[3].color = temp_colors[index][BLOCK];
  155.    fields[4].color = temp_colors[index][WARNING];
  156.    fields[5].color = temp_colors[index][MODE];
  157.    fields[6].color = temp_colors[index][WRAP];
  158.  
  159.    fields[0].show_me = show_help_color;
  160.    fields[1].show_me = show_fileheader_color;
  161.    fields[2].show_me = show_text_color;
  162.    fields[3].show_me = show_block_color;
  163.    fields[4].show_me = show_warning_color;
  164.    fields[5].show_me = show_mode_color;
  165.    fields[6].show_me = show_wrapped_color;
  166. }
  167.  
  168.  
  169. /*
  170.  * Name:    initialize
  171.  * Date:    July 21, 1991
  172.  * Notes:   See main.c for more info
  173.  */
  174. void video_config( )
  175. {
  176. #pragma pack( 1 )    /* Use pragma to force packing on byte boundaries. */
  177.  
  178. struct LOWMEMVID
  179. {
  180.    char     vidmode;           /* 0x449 */
  181.    unsigned scrwid;            /* 0x44A */
  182.    unsigned scrlen;            /* 0x44C */
  183.    unsigned scroff;            /* 0x44E */
  184.    struct   LOCATE
  185.    {
  186.       unsigned char col;
  187.       unsigned char row;
  188.    } csrpos[8];                /* 0x450 */
  189.    struct   CURSIZE
  190.    {
  191.       unsigned char end;
  192.       unsigned char start;
  193.    } csrsize;                  /* 0x460 */
  194.    char      page;             /* 0x462 */
  195.    unsigned  addr_6845;        /* 0x463 */
  196.    char      crt_mode_set;     /* 0x465 */
  197.    char      crt_palette[30];  /* 0x466 */
  198.    char      rows;             /* 0x484 */
  199.    unsigned  points;           /* 0x485 */
  200.    char      ega_info;         /* 0x487 */
  201.    char      info_3;           /* 0x488 */
  202. } vid;
  203. struct LOWMEMVID _far *pvid = &vid;
  204.  
  205. #pragma pack( )    /* revert to previously defined pack pragma. */
  206.  
  207. union REGS in, out;
  208. unsigned char temp, active_display;
  209.  
  210.    /* Move system information into uninitialized structure variable. */
  211.    movedata( 0, 0x449, FP_SEG( pvid ), FP_OFF( pvid ), sizeof( vid ) );
  212.  
  213.    cfg.rescan = FALSE;
  214.    in.x.ax =  0x1a00;
  215.    int86( VIDEO_INT, &in, &out );
  216.    temp = out.h.al;
  217.    active_display = out.h.bl;
  218.    if (temp == 0x1a && (active_display == 7 || active_display == 8))
  219.       cfg.adapter = VGA;
  220.    else {
  221.       in.h.ah =  0x12;
  222.       in.h.bl =  0x10;
  223.       int86( VIDEO_INT, &in, &out );
  224.       if (out.h.bl != 0x10) {         /* EGA */
  225.          if (vid.ega_info & 0x08) {
  226.             if (vid.addr_6845 == 0x3d4)
  227.                cfg.adapter = CGA;
  228.             else
  229.                cfg.adapter = MDA;
  230.          } else
  231.             cfg.adapter = EGA;
  232.       } else if (vid.addr_6845 == 0x3d4)
  233.          cfg.adapter = CGA;
  234.       else
  235.          cfg.adapter = MDA;
  236.    }
  237.  
  238.    if (cfg.adapter == CGA)
  239.       cfg.rescan = TRUE;
  240.  
  241.    cfg.mode = vid.vidmode;
  242.    if (vid.addr_6845 == 0x3D4) {
  243.       cfg.color = TRUE;
  244.       FP_SEG( cfg.videomem ) = 0xb800;
  245.    } else {
  246.       cfg.color = FALSE;
  247.       FP_SEG( cfg.videomem ) = 0xb000;
  248.    }
  249.    FP_OFF( cfg.videomem ) = 0x0000;
  250. }
  251.  
  252.  
  253. /*
  254.  * Name:    initialize
  255.  * Date:    July 21, 1991
  256.  * Notes:   Draw all of the sample screens.
  257.  */
  258. void show_init_sample( )
  259. {
  260. char *sample;
  261. int line, i, j, k, l;
  262. char temp[6], num[6];
  263. char far *p;
  264.  
  265.    xygoto( -1, -1 );
  266.    sample = sample_screen[0];
  267.    for (line=0; sample != NULL; ) {
  268.       s_output( (char far *)sample, line, 0, 7 );
  269.       sample = sample_screen[++line];
  270.    }
  271.    for (i=0; i<7; i++)
  272.       (*fields[i].show_me)();
  273.    sample = field_screen[0];
  274.    for (line=12, i=1; sample != NULL; line++,i++) {
  275.       s_output( (char far *)sample, line, 0, 7 );
  276.       sample = field_screen[i];
  277.    }
  278.    p = (char far *)temp;
  279.    for (i=0,k=0,line=17; i<8; i++, line++) {
  280.       for (j=0,l=0; j<16; j++, k++,l+=5) {
  281.          color_number( temp, k );
  282.          s_output( p, line, l, k );
  283.       }
  284.    }
  285.    for (i=0; i<7; i++) {
  286.       color_number( temp, fields[i].color );
  287.       s_output( p, fields[i].line, fields[i].col, fields[i].color );
  288.    }
  289. }
  290.  
  291.  
  292. /*
  293.  * Name:    color_number
  294.  * Date:    July 21, 1991
  295.  * Passed:  dest:  buffer to store the color sample
  296.  *          num:   attribute number
  297.  * Notes:   Show the use what the foreground and background colors look like.
  298.  */
  299. void color_number( dest, num )
  300. char *dest;
  301. int num;
  302. {
  303. int i, j, k;
  304. char temp[6];
  305.  
  306.    strcpy( dest, "[   ]" );
  307.    itoa( num, temp, 10 );
  308.    i = strlen( temp );
  309.    j = 4 - i;
  310.    for (k=0; i > 0; i--,j++, k++)
  311.       dest[j] = temp[k];
  312. }
  313.  
  314.  
  315. /*
  316.  * Name:    current_color_number
  317.  * Date:    July 21, 1991
  318.  * Passed:  dest:  buffer to store the color sample
  319.  *          num:   attribute number
  320.  * Notes:   Put '*' around the sample color to give the user an idea of where
  321.  *          the current field is.
  322.  */
  323. void current_color_number( dest, num )
  324. char *dest;
  325. int num;
  326. {
  327. int i, j, k;
  328. char temp[6];
  329.  
  330.    strcpy( dest, "*   *" );
  331.    itoa( num, temp, 10 );
  332.    i = strlen( temp );
  333.    j = 4 - i;
  334.    for (k=0; i > 0; i--,j++, k++)
  335.       dest[j] = temp[k];
  336. }
  337.  
  338.  
  339. /*
  340.  * Name:    getkey
  341.  * Date:    July 21, 1991
  342.  * Notes:   Return the key pressed by the user.
  343.  */
  344. int getkey( void )
  345. {
  346. unsigned key, lo, scan;
  347.  
  348.    /*
  349.     *  _bios_keybrd == int 16.  It returns the scan code in ah, hi part of key,
  350.     *  and the ascii key code in al, lo part of key.
  351.     */
  352.    key = _bios_keybrd( 0 );
  353.    lo = key & 0X00FF;
  354.    lo = (int)((lo == 0) ? (((key & 0XFF00) >> 8) + 256) : lo);
  355.    return( lo );
  356. }
  357.  
  358.  
  359. /*
  360.  * Name:    s_output
  361.  * Date:    July 21, 1991
  362.  * Passed:  s:     the string to display
  363.  *          line:  line number to begin display
  364.  *          col:   column number to begin display
  365.  *          attr:  color to display string
  366.  * Notes:   See tdeasm.c for more info
  367.  */
  368. void s_output( s, line, col, attr )
  369. char far *s;
  370. int line, col, attr;
  371. {
  372. int far *screen_ptr;
  373. int max_col;
  374. int off;
  375.  
  376.    max_col = 80;
  377.    screen_ptr = cfg.videomem;
  378.    off = line * 160 + col * 2;
  379.  
  380.    _asm {
  381.         push    ds              ; MUST save ds
  382.         push    di              ; save di on stack
  383.         push    si              ; save si on stack
  384.  
  385.         mov     bx, WORD PTR attr               ; keep attribute in bx
  386.         mov     cx, WORD PTR col                ; put cols in cx
  387.         mov     dx, WORD PTR max_col            ; keep max_col in dx
  388.         mov     di, WORD PTR screen_ptr         ; load offset of screen ptr
  389.         add     di, WORD PTR off
  390.         mov     ax, WORD PTR screen_ptr+2       ; load segment of screen ptr
  391.         mov     es, ax
  392.         mov     si, WORD PTR s  ; load offset of string ptr
  393.         or      si, si          ; is it == NULL?
  394.         je      getout          ; yes, no output needed
  395.         mov     ax, WORD PTR s+2        ; load segment of string ptr
  396.         or      ax, ax          ; is pointer == NULL?
  397.         je      getout          ; yes, no output needed
  398.         mov     ds, ax          ; load segment of text in ds
  399.         mov     ah, bl          ; put attribute in AH
  400. top:
  401.         cmp     cx, dx          ; col < max_cols?
  402.         jge     getout          ; no, thru with line
  403.         lodsb                   ; get next char in string - put in al
  404.         or      al, al          ; is it '\0'
  405.         je      getout          ; yes, end of string
  406.         stosw                   ; else show attr + char on screen (ah + al)
  407.         inc     cx              ; col++
  408.         jmp     SHORT top       ; get another character
  409. getout:
  410.         pop     si              ; get back si
  411.         pop     di              ; get back di
  412.         pop     ds              ; get back ds
  413.    }
  414. }
  415.  
  416.  
  417. /*
  418.  * Name:    cls
  419.  * Date:    July 21, 1991
  420.  * Notes:   Use bios to clear screen (video interrupt).
  421.  */
  422. void cls( )
  423. {
  424. int line;
  425.  
  426.    line = 24;
  427.    _asm {
  428.         xor     ch, ch                  ; starting row in ch = 0
  429.         xor     cl, cl                  ; starting column in cl = 0
  430.         mov     ax, WORD PTR line       ; get ending row
  431.         mov     dh, al                  ; put it in dh
  432.         mov     dl, 79                  ; ending column in dl = 79
  433.         mov     bh, 7                   ; attribute in bh  = 7 (normal)
  434.         mov     al, 0                   ; get number of lines
  435.         mov     ah, 6                   ; get function number
  436.         push    bp                      ; some dos versions wipe out bp
  437.         int     VIDEO_INT
  438.         pop     bp
  439.    }
  440. }
  441.  
  442.  
  443. /*
  444.  * Name:    hlight_line
  445.  * Date:    July 21, 1991
  446.  * Passed:  x:     column to begin hi lite
  447.  *          y:     line to begin hi lite
  448.  *          lgth:  number of characters to hi lite
  449.  *          attr:  attribute color
  450.  * Notes:   The attribute byte is the hi byte.
  451.  */
  452. void hlight_line( x, y, lgth, attr )
  453. int x, y, lgth, attr;
  454. {
  455. int off, far *pointer;
  456.  
  457.    pointer = cfg.videomem;
  458.    off = y * 160 + 2 * x + 1;  /* add one - so it points to attribute byte */
  459.    _asm {
  460.         push    di              ; save es
  461.  
  462.         mov     cx, lgth        ; number of characters to change color
  463.  
  464.         mov     di, WORD PTR pointer    ; get destination - video memory
  465.         add     di, off                 ; add offset
  466.         mov     ax, WORD PTR pointer+2  ;
  467.         mov     es, ax
  468.         mov     ax, attr        ; attribute
  469. lite_len:
  470.         stosb                   ; store a BYTE
  471.         inc     di              ; skip over character to next attribute
  472.         loop    lite_len        ; change next attribute
  473.         pop     di              ; restore di
  474.    }
  475. }
  476.  
  477.  
  478. /*
  479.  * Name:    show_help_color
  480.  * Date:    July 21, 1991
  481.  */
  482. void show_help_color( )
  483. {
  484. int color;
  485. int line, len;
  486.  
  487.    color = fields[0].color;
  488.    for (line=1; line <11; line++)
  489.       hlight_line( 1, line, 37, color );
  490. }
  491.  
  492.  
  493. /*
  494.  * Name:    show_fileheader_color
  495.  * Date:    July 21, 1991
  496.  */
  497. void show_fileheader_color( )
  498. {
  499.    hlight_line( 41, 1, 38, fields[1].color );
  500. }
  501.  
  502.  
  503. /*
  504.  * Name:    show_text_color
  505.  * Date:    July 21, 1991
  506.  */
  507. void show_text_color( )
  508. {
  509. int color;
  510. int line, len;
  511.  
  512.    color = fields[2].color;
  513.    for (line=2; line <6; line++)
  514.       hlight_line( 41, line, 38, color );
  515. }
  516.  
  517.  
  518. /*
  519.  * Name:    show_block_color
  520.  * Date:    July 21, 1991
  521.  */
  522. void show_block_color( )
  523. {
  524. int color;
  525. int line, len;
  526.  
  527.    color = fields[3].color;
  528.    for (line=6; line <9; line++)
  529.       hlight_line( 41, line, 38, color );
  530. }
  531.  
  532.  
  533. /*
  534.  * Name:    show_warning_color
  535.  * Date:    July 21, 1991
  536.  */
  537. void show_warning_color( )
  538. {
  539.    hlight_line( 41, 9, 38, fields[4].color );
  540. }
  541.  
  542.  
  543. /*
  544.  * Name:    show_mode_color
  545.  * Date:    July 21, 1991
  546.  */
  547. void show_mode_color( )
  548. {
  549.    hlight_line( 41, 10, 26, fields[5].color );
  550. }
  551.  
  552.  
  553. /*
  554.  * Name:    show_wrapped_color
  555.  * Date:    July 21, 1991
  556.  */
  557. void show_wrapped_color( )
  558. {
  559.    hlight_line( 67, 10, 12, fields[6].color );
  560. }
  561.  
  562.  
  563. /*
  564.  * Name:    change_colors
  565.  * Date:    July 21, 1991
  566.  * Notes:   Real workhorse function of the utility.  Get a key and then
  567.  *          figure out what to do with it.
  568.  */
  569. void change_colors( )
  570. {
  571. int c;
  572. int area;
  573. int color;
  574. int new_color;
  575. int i;
  576. char temp[6];
  577. char far *p;
  578.  
  579.    p = (char far *)temp;
  580.    area = 0;
  581.    current_color_number( temp, fields[area].color );
  582.    s_output( p, fields[area].line, fields[area].col, fields[area].color );
  583.    xygoto( fields[area].col+3, fields[area].line );
  584.    for (c=0; c != F3  &&  c != F10  &&  c != ESC;) {
  585.       new_color = FALSE;
  586.       c = getkey( );
  587.       switch (c) {
  588.          case RTURN :
  589.             color_number( temp, fields[area].color );
  590.             s_output( p, fields[area].line, fields[area].col, fields[area].color );
  591.             ++area;
  592.             if (area > 6)
  593.                area = 0;
  594.             current_color_number( temp, fields[area].color );
  595.             s_output( p, fields[area].line, fields[area].col, fields[area].color );
  596.             xygoto( fields[area].col+3, fields[area].line );
  597.             break;
  598.          case UP :
  599.             --fields[area].color;
  600.             if (fields[area].color < 0)
  601.                fields[area].color = 127;
  602.             new_color = TRUE;
  603.             break;
  604.          case DOWN :
  605.             ++fields[area].color;
  606.             if (fields[area].color > 127)
  607.                fields[area].color = 0;
  608.             new_color = TRUE;
  609.             break;
  610.          case PGUP :
  611.             fields[area].color -= 16;
  612.             if (fields[area].color < 0)
  613.                fields[area].color = (fields[area].color & 0x000f) + 0x70;
  614.             new_color = TRUE;
  615.             break;
  616.          case PGDN :
  617.             fields[area].color += 16;
  618.             if (fields[area].color > 127)
  619.                fields[area].color = fields[area].color & 0x000f;
  620.             new_color = TRUE;
  621.             break;
  622.          case F2 :
  623.             fields[0].color = colors[index][HELP];
  624.             fields[1].color = colors[index][HEAD];
  625.             fields[2].color = colors[index][TEXT];
  626.             fields[3].color = colors[index][BLOCK];
  627.             fields[4].color = colors[index][WARNING];
  628.             fields[5].color = colors[index][MODE];
  629.             fields[6].color = colors[index][WRAP];
  630.             for (i=0; i<7; i++) {
  631.                color_number( temp, fields[i].color );
  632.                s_output( p, fields[i].line, fields[i].col, fields[i].color );
  633.                (*fields[i].show_me)();
  634.             }
  635.             current_color_number( temp, fields[area].color );
  636.             s_output( p, fields[area].line, fields[area].col, fields[area].color );
  637.             break;
  638.       }
  639.       if (new_color) {
  640.          current_color_number( temp, fields[area].color );
  641.          s_output( p, fields[area].line, fields[area].col, fields[area].color );
  642.          (*fields[area].show_me)();
  643.       }
  644.    }
  645.    if (c == F10) {
  646.       temp_colors[index][HELP]    = fields[0].color;
  647.       temp_colors[index][HEAD]    = fields[1].color;
  648.       temp_colors[index][TEXT]    = fields[2].color;
  649.       temp_colors[index][BLOCK]   = fields[3].color;
  650.       temp_colors[index][WARNING] = fields[4].color;
  651.       temp_colors[index][MODE]    = fields[5].color;
  652.       temp_colors[index][WRAP]    = fields[6].color;
  653.       fseek( tde_exe, COLOR_OFFSET, SEEK_SET );
  654.       fwrite( (void *)temp_colors, sizeof( temp_colors ), 1, tde_exe );
  655.    }
  656.    fseek( tde_exe, 0l, SEEK_END );
  657.    fcloseall( );
  658.    cls( );
  659.    xygoto( 0, 0 );
  660. }
  661.